﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
#include <string.h>
//(1)字符分类函数islower...为真返回非零，为假返回零。int islower ( int c );
//int main()
//{
//	char c1 = 'a';
//	char c2 = 'B';
//	printf("%d\n", islower(c1));
//	printf("%d\n", islower(c2));
//}
//（2)将字符串中的⼩写字⺟转⼤写，其他字符不变。
// 1.
//int main()
//{
//	char arr[] = "Test String!";
//	char* p = arr;
//	while (*p)
//	{
//		if (islower(*p))
//		{
//			//小写字母-32为对应大写字母
//			*p -= 32;
//		}
//		p++;
//	}
//	printf("%s\n", arr);
//	return 0;
//}
//2.
//int main()
//{
//	char arr[] = "Test String!";
//	int i = 0;
//	while (arr[i])
//	{
//		/*if (arr[i] >= 'a' && arr[i] <= 'z')
//		{
//			arr[i] -= 32;
//		}*/
//		if (islower(arr[i]))
//		{
//			arr[i] -= 32;
//		}
//		i++;
//	}
//	printf("%s\n", arr);
//	return 0;
//}
//（3）字符类型转换
//int main()
//{
//	char c1 = 'g';
//	c1 = toupper(c1);
//	printf("%d\n", toupper(c1));//71
//	printf("%c\n", c1);//G
//	return 0;
//}
//int main()
//{
//	char arr[] = "Test String.";
//	int i = 0;
//	while (arr[i])
//	{
//		if (islower(arr[i]))
//		{
//			arr[i] = toupper(arr[i]);
//		}
//		i++;
//	}
//	printf("%s\n", arr);
//	return 0;
//}
//(4) strlen 的使⽤和模拟实现。size_t strlen ( const char * str );
//1.计数器
//size_t my_strlen(const char* arr)
//{
//	int count = 0;
//	assert(arr != NULL);
//	while (*arr)
//	{
//		arr++;
//		count++;
//	}
//	return count;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}
//2.递归
//size_t my_strlen(const char* arr)
//{
//	assert(arr!=NULL);//等价assert(NULL)
//	if (*arr)
//		return 1 + my_strlen(arr + 1);
//	else
//		return 0;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}
//3.指针相减
//size_t my_strlen(const char* arr)
//{
//	assert(arr);
//	const char* start = arr;
//	while (*start)
//	{
//		start++;
//	}
//	return start - arr;
//}
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}
//(5)strcpy函数返回的是目标空间的起始地址。目的：为了实现链式访问。
// char * strcpy ( char * destination, const char * source );
//int main()
//{
//	char arr1[] = "hello world";
//	char arr2[20] = { 0 };
//	strcpy(arr2, arr1);
//	printf("%s\n", arr2);
//	printf("%s\n", strcpy(arr2, arr1));
//	return 0;
//}
//strcpy模拟
//char* my_strcpy(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//
//	//拷贝过去字符后，判断表达式的值，当\0拷贝过去后，判断为假，停止循环。
//	/*while (*dest++ = *src++)
//	{
//		;
//	}*/
//
//	while (*src)
//	{
//		//*dest++ = *src++;
//		*dest = *src;
//		dest++;
//		src++;
//	}
//	*dest = *src;//拷贝'\0'
//	return ret;
//}
// //strncpy
//char * strncpy ( char * destination, const char * source, size_t num )
//int main()
//{
//	char str1[] = "To be or not to be";
//	char str2[40];
//	char str3[40];
//
//	/* copy to sized buffer (overflow safe): */
//	char* ret = strncpy(str2, str1, sizeof(str2));
//
//	/* partial copy (only 5 chars): */
//	strncpy(str3, str2, 5);
//	str3[5] = '\0';   /* null character manually added */
//
//	printf("%s\n", ret);
//	puts(str3);
//	
//
//	return 0;
//}
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[20] = { 0 };
//	char* p = my_strcpy(arr2, arr1);
//	printf("%s\n", arr2);
//	printf("%s\n",p);
//	printf("%s\n", my_strcpy(arr2, arr1));
//	return 0;
//}
//(6)strcat返回目标空间的地址。char * strcat ( char * destination, const char * source );
//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "wrold";
//	strcat(arr1, arr2);
//	printf("%s\n", arr1);//hello wrold
//	printf("%s\n", strcat(arr1, arr2));//hello wroldwrold
//	return 0;
//}
//int main()
//{
//	char str1[] = "gggttthh";
//	char str2[256] = "ssss";
//	strncat(str2, str1, 7);
//	puts(str2);
//	return 0;
//}
//模拟strcat
//char* my_strcat(char* dest, const char* src)
//{
//	assert(dest && src);
//	char* ret = dest;
//
//	//错误写法。原因：跳过了'\0'，不会覆盖'\0'。
//	/*while (*dest++ != '\0')
//	{
//		;
//	}*/
//
//	//正确写法
//	while (*dest!='\0')
//	{
//		dest++;
//	}
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "wrold";
//	my_strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}
//strtok//char * strtok ( char * str, const char * sep)
//int main()
//{
//	char arr[] = "zpengwei@yeah.net@hehe.haha#ttttt";
//	char buf[256] = { 0 };
//	strcpy(buf, arr);
//	char* sep = "@.#";
//	char* ret = NULL;
//	for (ret=strtok(buf, sep); ret != NULL; ret=strtok(NULL, sep))
//	{
//		printf("%s\n", ret);
//	}
//	return 0;
//}
//
//int main()
//{
//	char arr[] = "192.168.6.111";
//	char buf[256] = { 0 };
//	strcpy(buf, arr);
//	char sep[] = ".";
//	char* ret = NULL;
//	for (ret = strtok(buf, sep); ret != NULL; ret = strtok(NULL, sep))
//	{
//		printf("%s\n",ret);
//	}
//	return 0;
//}
//(7)strcmp模拟。int strcmp(const char* str1, const char* str2)
//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		str1++;
//		str2++;
//		if (*str1 == '\0')
//		{
//			return 0;
//		}
//	}
//	if (*str1 > *str2)
//	{
//		return *str1 - *str2;
//	}
//	else
//	{
//		return *str1 - *str2;
//	}
//}
//int main()
//{
//	char str1[] = "abcte";
//	char str2[] = "abcde";
//	int ret = my_strcmp(str1, str2);
//	printf("%d\n", ret);
//	return 0;
//}
// (1)size_t strlen(char* str)
// (2)char* strcpy(char* destination, const char* source)
// (3)char* strcat(char* destination, const char* source)
// (4)int strcmp(const char* str1, const char* str2)
// (5)const char * strstr ( const char * str1, const char * str2 )
// (6)char * strerror ( int errnum )
//(8)strstr
//int main()
//{
//	char str1[20] = "abcdefghijk";
//	char str2[20] = "def";
//	char* p = strstr(str1, str2);
//	printf("%s\n", p);
//	return 0;
//}
//int main()
//{
//	char str1[20] = "abcdefghk";
//	char str2[20] = "cme";
//	char* p = strstr(str1, str2);
//	if (p)
//	{
//		printf("%s\n", p);
//	}
//	else
//	{
//		printf("找不到!\n");
//	}
//	return 0;
//}
//模拟实现strstr
//const char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	const char* s1 = NULL;
//	const char* s2 = NULL;
//	const char* cur = str1;
//	if (*str2=='\0')
//	{
//		return str1;
//	}
//	while (*cur)
//	{
//		s1 = cur;
//		s2 = str2;
//		while (s1 && s2 && *s1 == *s2)
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//		{
//			return cur;
//		}
//		cur++;
//	}
//	return NULL;
//}
//
//int main()
//{
//	char str1[20] = "abcdefgh";
//	char str2[20] = "def";
//	char* p = my_strstr(str1, str2);
//	printf("%s\n", p);
//	return 0;
//}
// char * strtok ( char * str, const char * delimiters )
//int main()
//{
//    char str1[] = "- This, a sample string.";
//    char str2[256];
//    strcpy(str2, str1);
//    char* pch;
//    printf("Splitting string \"%s\" into tokens:\n", str1);
//    pch = strtok(str2, " ,.-");
//    while (pch != NULL)
//    {
//        printf("%s\n", pch);
//        pch = strtok(NULL, " ,.-");
//    }
//    printf("%s\n", str1);
//    return 0;
//}
//(9)strerror
//int main()
//{
//	FILE* pf = fopen("gggg.txt", "r");
//	if (pf==NULL)
//	{
//		printf("打开失败，原因是：%s\n",strerror(errno));
//		perror("打开失败，原因是");
//	}
//	else
//	{
//		printf("打开成功!\n");
//		fclose(pf);
//		pf = NULL;
//	}
//	return 0;
//}
//int main()
//{
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d:%s\n", i, strerror(i));
//	}
//	return 0;
//}
// (10)void* memcpy(void* destination, const void* source, size_t num)
// 1.
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 11,12,13 };
//	memcpy(arr1, arr2, 8);
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}
//2.
//int main()
//{
//	char str1[20] = "abdefght";
//	char str2[20] = { 0 };
//	memcpy(str2, str1, 5);
//	printf("%s\n", str2);
//	return 0;
//}
// 3.
//struct
//{
//	char name[40];
//	int age;
//} person, person_copy;
//
//int main()
//{
//	char myname[] = "Pierre de Fermat";
//
//	/* using memcpy to copy string: */
//	memcpy(person.name, myname, strlen(myname) + 1);
//	person.age = 46;
//
//	/* using memcpy to copy structure: */
//	memcpy(&person_copy, &person, sizeof(person));
//
//	printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
//
//	return 0;
//}
// 
//模拟memcpy
//void* my_memcpy(void* dest, const void* src, size_t num)
//{
//	char* ret = dest;
//	assert(dest && src);
//	while (num--)
//	{
//		*(char*)dest = *(char*)src;
//		dest = (char*)dest + 1;
//		src = (char*)src + 1;
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[15] = { 0 };
//	my_memcpy(arr2, arr1, 20);
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}
//(11)void * memmove ( void * destination, const void * source, size_t num )
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[15] = { 0 };
//	memmove(arr2, arr1, 30);
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}
//
//int main()
//{
//	char str[] = "memmove can be very useful......";
//	memmove(str + 20, str + 15, 11);
//	puts(str);//put会自动在末尾附加一个换行符
//	printf("ggh");
//	return 0;
//}
//(12)void * memset ( void * ptr, int value, size_t num )
//int main()
//{
//	char str[] = "hello world!";
//	memset(str, '-', 5);因为字符在ascll表中是整型，字符字母都是整型家族。
//	puts(str);
//	return 0;
//}
//(13)int memcmp ( const void * ptr1, const void * ptr2, size_t num )
//int main()
//{
//	char buffer1[] = "DWgaOtP12df0";
//	char buffer2[] = "DWGAOTP12DF0";
//	int n;
//	n = memcmp(buffer1, buffer2, sizeof(buffer1));
//
//	if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
//	else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);
//	else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
//
//	return 0;
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 1,2,3,6,5 };
//	int ret = memcmp(arr1, arr2, 13);
//	printf("%d\n", ret);
//	return 0;
//}
//(14)int atoi (const char * str)
//将数字字符串转换为整数
//int main()
//{
//	int i;
//	char buffer[256];
//	printf("Enter a number: ");
//	fgets(buffer, 256, stdin);
//	i = atoi(buffer);
//	printf("The value entered is %d. Its double is %d.\n", i, i * 2);
//	return 0;
//}
//模拟
//int my_atoi(const char* str)
//{
//	int num = 0;
//	while (*str)
//	{
//		num = num * 10 + *str - '0';
//		str++;
//	}
//	return num;
//}
//int main()
//{
//	char str_num[256];
//	printf("Enter a number: ");
//	gets(str_num);
//	int ret = my_atoi(str_num);
//	printf("%d\n", ret);
//	return 0;
//}
